package com.justnow.solution;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 用两个队列来实现一个栈
 * 基本思想是：
 * 1. 每次只在其中的一个队列中保存数据
 * 2. 当往栈中插入数据时，直接插入保存数据队列的尾部
 * 3. 当出栈时，循环的将保存数据队列中的数据从头出队，直到该队列的长度为1，之前的数据保存到另一个队列中，最后一个数据直接抛弃。最后第二个队列中的数据出队然后保存到第一个队列中
 *
 */
public class StackByQueue {

    private Queue<Integer> queue1 = new LinkedList<>();
    private Queue<Integer> queue2 = new LinkedList<>();

    public void in(int value) {
        queue1.add(value);
    }

    public int out() {
        int size = queue1.size();
        if(size == 0) {
            return -1;
        }
        while(size > 1) {
            Integer temp = queue1.poll();
            queue2.add(temp);
            size--;
        }
        int size2 = queue2.size();
        while(size2 > 0) {
            int temp2 = queue2.poll();
            queue1.add(temp2);
            size2--;
        }
        return queue1.poll();
    }

    public static void main(String[] args) {
        StackByQueue stackByQueue = new StackByQueue();
        stackByQueue.in(1);
        stackByQueue.in(2);
        stackByQueue.in(3);
        stackByQueue.in(4);
        stackByQueue.in(5);
        System.out.println(stackByQueue.out());
        stackByQueue.in(6);
        System.out.println(stackByQueue.out());
        System.out.println(stackByQueue.out());
        System.out.println(stackByQueue.out());
        System.out.println(stackByQueue.out());
        System.out.println(stackByQueue.out());
    }
}
